package com.stylefeng.guns.modular.api;

import java.util.HashMap;

import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.apache.shiro.util.ByteSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.stylefeng.guns.core.base.controller.BaseController;
import com.stylefeng.guns.core.base.tips.ErrorTip;
import com.stylefeng.guns.core.shiro.ShiroKit;
import com.stylefeng.guns.core.shiro.ShiroUser;
import com.stylefeng.guns.core.util.JwtTokenUtil;
import com.stylefeng.guns.modular.system.dao.UserMapper;
import com.stylefeng.guns.modular.system.model.User;

/**
 * 接口控制器提供
 *
 * @author stylefeng
 * @Date 2018/7/20 23:39
 */
@RestController
@RequestMapping("/gunsApi")
public class ApiController extends BaseController {

	@Autowired
	private UserMapper userMapper;

	/**
	 * api登录接口，通过账号密码获取token
	 */
	@RequestMapping("/auth")
	public Object auth(@RequestParam("username") String username, @RequestParam("password") String password) {

		// 封装请求账号密码为shiro可验证的token
		UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(username, password.toCharArray());

		// 获取数据库中的账号密码，准备比对
		User user = userMapper.getByAccount(username);

		String credentials = user.getPassword();
		String salt = user.getSalt();
		ByteSource credentialsSalt = new Md5Hash(salt);
		SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(new ShiroUser(), credentials, credentialsSalt, "");

		// 校验用户账号密码
		HashedCredentialsMatcher md5CredentialsMatcher = new HashedCredentialsMatcher();
		md5CredentialsMatcher.setHashAlgorithmName(ShiroKit.hashAlgorithmName);
		md5CredentialsMatcher.setHashIterations(ShiroKit.hashIterations);
		boolean passwordTrueFlag = md5CredentialsMatcher.doCredentialsMatch(usernamePasswordToken, simpleAuthenticationInfo);

		if (passwordTrueFlag) {
			HashMap<String, Object> result = new HashMap<>();
			result.put("token", JwtTokenUtil.generateToken(String.valueOf(user.getId())));
			return result;
		} else {
			return new ErrorTip(500, "账号密码错误！");
		}
	}

	/**
	 * 测试接口是否走鉴权
	 */
	@RequestMapping(value = "/test", method = RequestMethod.POST)
	public Object test() {
		return SUCCESS_TIP;
	}

}
